.global _start
.global PackedELF
.global Signature

	.extern _signature

	.text

#
# This signature has to be stored right before the PackedELF location. It will
# be used to identify the stubs against the compression modules inside the
# packer. It can also be used by the unpacker stub to see if the compressor is
# matching the stub.
#
Signature:
	.word	_signature

#
# This variable has to be stored right before the _start location. That
# way, the packer will change it so to match the user's options.
#
PackedELF:
	.word	0x1b00000

	.ent _start
_start:
	lw	$s2, PackedELF
	
	lw	$s5, 0($s2)	// entry point
	lw	$s6, 4($s2)	// number of sections
	
	addiu	$s2, 8

loop:
	addiu	$s6, -1		// decrement number of sections
	
	lw	$s1, 8($s2)	// virtual address == destination
	addiu	$s0, $s2, 16	// skip original size, zero byte size, virtual address, compressed size, == source
	lw	$s3, 0($s2)
	addu	$s4, $s3, $s1
	bal	n2e_decompress
	
	lw	$s0, 4($s2)
	lw	$s1, 12($s2)
	addiu	$s2, 16
	addu	$s2, $s1
	andi	$s1, $s2, 3

	.set noreorder
zero_loop:
	sb	$0, 0($s4)
	addiu   $s4, 1
	bnez	$s0, zero_loop
	addiu	$s0, -1
	
	ori	$s2, 3
	bnez	$s1, 1f
	addiu	$s2, 1
	addiu   $s2, -4
	.set reorder
1:
	bnez	$s6, loop
	
	move	$s0, $a0
	move	$s1, $a1

	li	$v1, 0x64
	move	$a0, $0
	syscall
	
	li	$v1, 0x64
	li	$a0, 2
	syscall
	
	move	$a0, $s0
	move	$a1, $s1
	
	jr	$s5

	.end _start

#include "ucl/n2e.S"
